home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / MATH / PASCMP / FFTTEST.PAS < prev    next >
Pascal/Delphi Source File  |  1994-06-29  |  2KB  |  103 lines

  1. { Example for Fast Fourier Transform Unit PasFFT       }
  2. { (c)1994 by Alex Klimovitski                          }
  3.  
  4. { This program reads some complex numbers from a
  5.   text file, performs fast Fourier transform and writes
  6.   the result in another text file.
  7.   The text file format:
  8.  
  9.   <number of points>
  10.   <real part 1> <imaginary part 1>
  11.   <real part 2> <imaginary part 2>
  12.   .......
  13.  
  14.   Check, wether it's really fast! You can use file
  15.   FFTTEST.DAT with 64 complex points (numbers).        }
  16.  
  17. program FFTTest;
  18.  
  19. uses WinCrt, PasCmplx, PasFFT;
  20. { Delete 'WinCrt' if your target is DOS or DPMI }
  21.  
  22. function ReadFile(FName: PChar; var N: Integer; var X: PCmplxArr): Boolean;
  23. var
  24.   F: Text;
  25.   I: Integer;
  26.   A, B: Double;
  27. begin
  28.   ReadFile := false;
  29.   X := nil;
  30.   {$I-}
  31.   Assign(F, FName);
  32.   Reset(F);
  33.  
  34.   ReadLn(F, N);
  35.   GetMem(X, N * SizeOf(Complex));
  36.  
  37.   for I := 1 to N do
  38.   begin
  39.     ReadLn(F, A, B);
  40.     X^[I] := Cmplx(A, B);
  41.   end;
  42.  
  43.   Close(F);
  44.   {$I+}
  45.  
  46.   if IOResult = 0 then
  47.     ReadFile := true
  48.   else if X <> nil then
  49.     FreeMem(X, N * SizeOf(Complex));
  50. end;  { ReadFile }
  51.  
  52. function WriteFile(FName: PChar; N: Integer; X: PCmplxArr): Boolean;
  53. var
  54.   F: Text;
  55.   I: Integer;
  56. begin
  57.   {$I-}
  58.   Assign(F, FName);
  59.   Rewrite(F);
  60.  
  61.   WriteLn(F, N);
  62.   for I := 1 to N do
  63.     WriteLn(F, CReal(X^[I]), ' ', CImag(X^[I]));
  64.  
  65.   Close(F);
  66.   {$I+}
  67.  
  68.   if IOResult = 0 then ;
  69. end;  { WriteFile }
  70.  
  71. var
  72.   X: PCmplxArr;
  73.   N: Integer;
  74.   A: Char;
  75.   FName: array[0..79] of Char;
  76. begin
  77.   Write('Filename for Input>');
  78.   ReadLn(FName);
  79.   if not ReadFile(FName, N, X) then
  80.   begin
  81.     WriteLn('Can''t read file ', FName);
  82.     Halt(255);
  83.   end;
  84.  
  85.   Write('Mode (D)irect/(I)nverse>');
  86.   ReadLn(A);
  87.  
  88.   if not CFFT(N, (A = 'I') or (A = 'i'), X, 1.0) then
  89.   begin
  90.     WriteLn('Can''t perform FFT', FName);
  91.     if X <> nil then
  92.       FreeMem(X, N * SizeOf(Complex));
  93.     CFFTClear;
  94.     Halt(254);
  95.   end;
  96.  
  97.   Write('Filename for Output>');
  98.   ReadLn(FName);
  99.   WriteFile(FName, N, X);
  100.  
  101.   FreeMem(X, N * SizeOf(Complex));
  102. end.
  103.